package com.netmi.myjectpack.fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableField;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import com.netmi.myjectpack.R;
import com.netmi.myjectpack.bean.UserInfo;
import com.netmi.myjectpack.bean.UserInfoViewMole;
import com.netmi.myjectpack.databinding.FragmentLivedataBinding;
import com.netmi.myjectpack.viewmodel.MyBaseLiveDataViewModel;
import com.netmi.myjectpack.viewmodel.MyBaseViewModel;

import java.util.Random;

/**
 * 类描述：
 * 创建人：tgw
 * 创建时间：2020/8/6
 * 修改备注：
 */
public class LiveDataFragment extends Fragment {
    public static final String TAG = LiveDataFragment.class.getName();

    private FragmentLivedataBinding mBinding;
    private MyBaseLiveDataViewModel model;//两个绑定同一个activity实例

    private MyBaseViewModel viewModel;

    private UserInfo info;
    private UserInfoViewMole infoViewModel;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (mBinding == null)
            mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_livedata, container, false);
        return mBinding.getRoot();
    }


    //使用databin绑定点击事件
    public void doClick(View view) {
        Random random = new Random();
        info.setNickname("livedata-tgw改变" + random.nextInt(100));
        model.getUserInfo().setValue(info);


        //自定义viewmodel,但不知道为什么影响了livedata的数据
        infoViewModel.setNickname("viewmodel-tgw改变" + random.nextInt(100)+infoViewModel.getAddress());
        viewModel.setUserInfo(infoViewModel);
        viewModel.updataData(); //局部刷新

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        info = new UserInfo();
        info.setNickname("tgw");
        infoViewModel = new UserInfoViewMole();
        infoViewModel.setNickname("tgwViewMole");
        infoViewModel.setAddress("局部刷新地址");
        // Get the ViewModel.  注意 这里使用 getActivity() 引用绑定activity，这里fragment改变userinfo数据
        //LiveDataDetailsFragment中的内容也会相应改变
        model = new ViewModelProvider(getActivity()).get(MyBaseLiveDataViewModel.class);
        viewModel = new ViewModelProvider(getActivity()).get(MyBaseViewModel.class);
        //设置初始值
        model.getUserInfo().setValue(info);
        //自定义viewnodel
        viewModel.setUserInfo(infoViewModel);
        viewModel.updataData();
        //observer 当userinfo的数据发生改变时调用 下面的方法
        // Create the observer which updates the UI.  当
        final Observer<UserInfo> nameObserver = new Observer<UserInfo>() {
            @Override
            public void onChanged(@Nullable final UserInfo userInfo) {
                // Update the UI, in this case, a TextView.
//                userInfo.setNickname("tgw灵台一中哈哈"); //数据改变调用该方法 这里可以再次改变值
//                mBinding.tvViewmodelName.setText(userInfo.getNickname());

//                mBinding.setLivedataviewmodel(model);
            }
        };

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.getUserInfo().observe(this, nameObserver);  //livedata刷新使用

        /**我们可以使用 LiveData 对象作为数据绑定源，在数据发生变化时自动通知 UI。
         与实现 Observable 的对象（如可观察字段）不同，LiveData 对象知道订阅数据更改的观察者的生命周期。
         在Android Studio 3.1及更高版本中，我们可以在数据绑定代码中用 LiveData 对象替换 可观察字段。
         要想在绑定类中使用 LiveData 对象，我们需要指定生命周期所有者来定义LiveData 对象的范围。
         以下示例在绑定类实例化后指定 activity 作为生命周期所有者：*/
        mBinding.setLivedataviewmodel(model);
        mBinding.setViewmodel(viewModel);

        //Specify the current activity as the lifecycle owner.  livedata的刷新使用
        //这句话 功能类似于 这句话 model.getUserInfo().observe(this, nameObserver);与  mBinding.setLivedataviewmodel(model);
//        mBinding.setLifecycleOwner(this);

        //databinding的绑定事件
        mBinding.setLiveDataFragment(LiveDataFragment.this);
    }
}
